package com.aw.baselib.util;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.text.TextUtils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.UUID;

/**
 * @author LiuShiKai
 * @version 1
 * @date 2018/8/21
 * @describe 获得设备相关信息的工具类
 */
public class EquipmentInfoUtils {
    /**
     * 获取手机IMEI号
     * <p>
     * 需要动态权限: android.permission.READ_PHONE_STATE
     */
    public static String getDeviceId(Context context) {
        String deviceId = "";
//        if(!TextUtils.isEmpty(SirunAppAplication.getInstance().getmDeviceToken())) {
//            deviceId = SirunAppAplication.getInstance().getmDeviceToken();
//        } else {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (context.checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
                    TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(context.TELEPHONY_SERVICE);
                    deviceId = telephonyManager.getDeviceId();
                } else {
                    deviceId = getInstalltionId(context);
                }
            } else {
                deviceId = getInstalltionId(context);
            }
            if(TextUtils.isEmpty(deviceId)) {
                deviceId = getAndroidId(context);
            }
            if(TextUtils.isEmpty(deviceId)) {
                deviceId = getInstalltionId(context);
            }
            if(TextUtils.isEmpty(deviceId) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                deviceId = Build.getSerial();
            }
            if(TextUtils.isEmpty(deviceId) || deviceId == null || deviceId.equals("null")) {
                deviceId = "000000" + System.currentTimeMillis() + "DAYUN";
            }
//        }
        return deviceId;
    }

    /**
     * 获取AndroidID
     * 在设备首次启动时，系统会随机生成一个64位的数字，并把这个数字以16进制字符串的形式保存下来。
     * 不需要权限，平板设备通用。获取成功率也较高，缺点是设备恢复出厂设置会重置。
     * 另外就是某些厂商的低版本系统会有bug，返回的都是相同的AndroidId
     */
    public static String getAndroidId(Context context) {
        return Settings.System.getString(context.getContentResolver(), Settings.System.ANDROID_ID);
    }


    /**
     * 获取设备的Installtion ID
     * 这种方式的原理是在程序安装后第一次运行时生成一个ID，该方式和设备唯一标识不一样，
     * 不同的应用程序会产生不同的ID，同一个程序重新安装也会不同。所以这不是设备的唯一ID，
     * 但是可以保证每个用户的ID是不同的。可以说是用来标识每一份应用程序的唯一ID（即Installtion ID），
     * 可以用来跟踪应用的安装数量等。
     *
     * @param context 上下文
     * @return Installtion ID
     */
    public synchronized static String getInstalltionId(Context context) {
        String InstalltionID;
        File installation = new File(context.getFilesDir(), "SignUtil");
        try {
            if (!installation.exists()) {
                writeInstallationFile(installation);
            }
            InstalltionID = readInstallationFile(installation);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return InstalltionID;
    }

    private static String readInstallationFile(File installation) throws IOException {
        RandomAccessFile f = new RandomAccessFile(installation, "r");
        byte[] bytes = new byte[(int) f.length()];
        f.readFully(bytes);
        f.close();
        return new String(bytes);
    }

    private static void writeInstallationFile(File installation) throws IOException {
        FileOutputStream out = new FileOutputStream(installation);
        String id = UUID.randomUUID().toString();
        out.write(id.getBytes());
        out.close();
    }
}
